Is inherited class a derivative work?

Chris Gray chris.gray at acunia.com
Wed Oct 24 13:09:04 UTC 2001


Michael Beck wrote:

> > -----Original Message-----
> > From: chris.gray at acunia.com [mailto:chris.gray at acunia.com]
> > Sent: Monday, October 22, 2001 06:06
>
> > Every implementation of the Java language contains the
> > non-abstract class
> > java.util.Properties, which does in fact implement all the methods of
> > Dictionary.
> > So let us suppose that I create a class
> > com.acunia.AcuniaProperties which
> > extends java.util.Properties, and that this is packaged
> > together with some
> > other classes in a .jar file.  I then hand this over to our
> > sales force, who are
> > liable to use it in a customer demonstration.  I have no way
> > of knowing whether
> > they will demonstrate it running on our own VM (Wonka), IBM's
> > J9, Kaffe (as a component of Pocket Linux), HP's Chai, something
> > licensed  from Sun's pJava,
> > or something I've never even heard of.  Can it really be that
> > by creating my
> > little class I have actually changed the design blueprints of
> > products from
> > four different companies, without even knowing it?
>
> I would distinguish here between creating a derived class, and using a
> particular implementation of the original class' interface at the run-time.
>
> I would assume that you don't extend a class in a vacuum, i.e. that you take an
> actual java.util.Properties class and extend it.

I would argue that this assumption is incorrect.  Take the attached
source for Provider.java as an example: all that my colleague needed
in order to write that was to know that java.util.Properties has methods
load, get, put, and remove, which can be overridden.  He didn't need
to `take an actual java.util.Properties class' in order to write what he did.

> If the author gives you the
> right to create derived classes, then you are OK.

There is no author, because there is no class.

>
> Now comes the "use" of particular class at the run-time. It would seem to me
> that at this moment you can use any concrete class, as long as the author gives
> you the right to create derived classes, i.e. if Kaffe, Chai, and J9 give you
> the right to derive new classes, you can use anyone of them, even if you
> originally created the inherited class from Kaffe's java.util.Properties.

The only class not derived from another class is java.lang.Object.
A class library which does not allow derived classes is useless.

> Or you can (if possible in Java) compile a file with the original class you have
> used, so the program doesn't have to look for it, but uses the one provided by
> you.

A good implementation will barf on that.  If you can supply your
own java.util.Properties then you can undermine the whole security
framework.  But that's another topic. :)

Regards

Chris


-------------- next part --------------
/**************************************************************************
* Copyright  (c) 2001 by Acunia N.V. All rights reserved.                 *
*                                                                         *
* This software is copyrighted by and is the sole property of Acunia N.V. *
* and its licensors, if any. All rights, title, ownership, or other       *
* interests in the software remain the property of Acunia N.V. and its    *
* licensors, if any.                                                      *
*                                                                         *
* This software may only be used in accordance with the corresponding     *
* license agreement. Any unauthorized use, duplication, transmission,     *
*  distribution or disclosure of this software is expressly forbidden.    *
*                                                                         *
* This Copyright notice may not be removed or modified without prior      *
* written consent of Acunia N.V.                                          *
*                                                                         *
* Acunia N.V. reserves the right to modify this software without notice.  *
*                                                                         *
*   Acunia N.V.                                                           *
*   Vanden Tymplestraat 35      info at acunia.com                           *
*   3000 Leuven                 http://www.acunia.com                     *
*   Belgium - EUROPE                                                      *
**************************************************************************/

/*
** $Id: Provider.java,v 1.3 2001/09/04 14:59:14 oberfeld Exp $
*/

package java.security;

import java.util.*;
import java.io.*;

public abstract class Provider extends Properties{

  private String info;
  private String name;
  private double version;

  protected Provider(String name, double version, String info){
        this.info = info;
        this.name = name;
        this.version = version;
  }

  public String getInfo(){
        return info;
  }

  public String getName(){
        return name;
  }

  public double getVersion(){
        return version;
  }

  public String toString()  {
        return name+" version: "+version;
  }

  public Set entrySet(){
        return Collections.unmodifiableSet(super.entrySet());
  }

  public Set keySet(){
        return Collections.unmodifiableSet(super.keySet());
  }

  public Collection values(){
        return Collections.unmodifiableCollection(super.values());
  }

  public void clear() {
    SecurityManager sm = System.getSecurityManager();

    if (sm!=null) {
      sm.checkSecurityAccess("clearProviderProperties."+name);
    }
    super.clear();
  }

  public void load(InputStream in) throws IOException {
        super.load(in);
  }

  public Object put(Object key, Object value) {
    SecurityManager sm = System.getSecurityManager();

    if (sm!=null) {
        sm.checkSecurityAccess("putProviderProperty."+name);
    }
    return super.put(key,value);
  }

  public void putAll(Map t){
        SecurityManager sm = System.getSecurityManager();

        if (sm!=null) {
                sm.checkSecurityAccess("putProviderProperty."+name);
        }
        Iterator it = t.entrySet().iterator();
        while (it.hasNext()){
                Map.Entry me = (Map.Entry)it.next();
                super.put(me.getKey(),me.getValue());
        }
  }

  public Object remove(Object key) {
        SecurityManager sm = System.getSecurityManager();

        if (sm!=null) {
                sm.checkSecurityAccess("removeProviderProperty."+name);
        }
        return super.remove(key);
  }


}


More information about the License-discuss mailing list