001: /*
002: (c) Copyright 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
003: All rights reserved - see end of file.
004: $Id: AssemblerGroup.java,v 1.14 2008/01/02 12:09:36 andy_seaborne Exp $
005: */
006:
007: package com.hp.hpl.jena.assembler.assemblers;
008:
009: import java.util.*;
010:
011: import com.hp.hpl.jena.assembler.*;
012: import com.hp.hpl.jena.assembler.exceptions.*;
013: import com.hp.hpl.jena.rdf.model.*;
014: import com.hp.hpl.jena.vocabulary.RDFS;
015:
016: public abstract class AssemblerGroup extends AssemblerBase implements
017: Assembler {
018: public abstract AssemblerGroup implementWith(Resource type,
019: Assembler a);
020:
021: public abstract Assembler assemblerFor(Resource type);
022:
023: public Model openModel(Resource resource) {
024: return (Model) open(resource);
025: }
026:
027: public static AssemblerGroup create() {
028: return new ExpandingAssemblerGroup();
029: }
030:
031: public AssemblerGroup copy() {
032: ExpandingAssemblerGroup result = (ExpandingAssemblerGroup) create();
033: result.internal.mappings
034: .putAll(((ExpandingAssemblerGroup) this ).internal.mappings);
035: return result;
036: }
037:
038: public static class Frame {
039: public final Resource root;
040: public final Resource type;
041: public final Class assembler;
042:
043: public Frame(Resource root, Resource type, Class assembler) {
044: this .root = root;
045: this .type = type;
046: this .assembler = assembler;
047: }
048:
049: public boolean equals(Object other) {
050: return other instanceof Frame && same((Frame) other);
051: }
052:
053: protected boolean same(Frame other) {
054: return root.equals(other.root) && type.equals(other.type)
055: && assembler.equals(other.assembler);
056: }
057:
058: public String toString() {
059: return "root: " + root + " with type: " + type
060: + " assembler class: " + assembler;
061: }
062: }
063:
064: public static class ExpandingAssemblerGroup extends AssemblerGroup {
065: PlainAssemblerGroup internal = new PlainAssemblerGroup();
066: Model implementTypes = ModelFactory.createDefaultModel();
067:
068: public Object open(Assembler a, Resource suppliedRoot, Mode mode) {
069: List doing = new ArrayList();
070: Resource root = AssemblerHelp.withFullModel(suppliedRoot);
071: loadClasses(root.getModel());
072: root.getModel().add(implementTypes);
073: return internal.open(a, root, mode);
074: }
075:
076: public void loadClasses(Model model) {
077: AssemblerHelp.loadArbitraryClasses(this , model);
078: AssemblerHelp.loadAssemblerClasses(this , model);
079: }
080:
081: public AssemblerGroup implementWith(Resource type, Assembler a) {
082: implementTypes.add(type, RDFS.subClassOf, JA.Object);
083: internal.implementWith(type, a);
084: return this ;
085: }
086:
087: public Assembler assemblerFor(Resource type) {
088: return internal.assemblerFor(type);
089: }
090:
091: public Set implements Types() {
092: return implementTypes.listStatements().mapWith(
093: Statement.Util.getSubject).toSet();
094: }
095: }
096:
097: static class PlainAssemblerGroup extends AssemblerGroup {
098: Map mappings = new HashMap();
099:
100: public Object open(Assembler a, Resource root, Mode mode) {
101: Set types = AssemblerHelp
102: .findSpecificTypes(root, JA.Object);
103: if (types.size() == 0)
104: throw new NoSpecificTypeException(root);
105: else if (types.size() > 1)
106: throw new AmbiguousSpecificTypeException(root,
107: new ArrayList(types));
108: else
109: return openBySpecificType(a, root, mode,
110: (Resource) types.iterator().next());
111: }
112:
113: private Object openBySpecificType(Assembler a, Resource root,
114: Mode mode, Resource type) {
115: Assembler toUse = assemblerFor(type);
116: Class aClass = toUse == null ? null : toUse.getClass();
117: Frame frame = new Frame(root, type, aClass);
118: try {
119: if (toUse == null)
120: throw new NoImplementationException(this , root,
121: type);
122: else
123: return toUse.open(a, root, mode);
124: } catch (AssemblerException e) {
125: throw e.pushDoing(frame);
126: } catch (Exception e) {
127: AssemblerException x = new AssemblerException(root,
128: "caught: " + e.getMessage(), e);
129: throw x.pushDoing(frame);
130: }
131: }
132:
133: public AssemblerGroup implementWith(Resource type, Assembler a) {
134: mappings.put(type, a);
135: return this ;
136: }
137:
138: public Assembler assemblerFor(Resource type) {
139: return (Assembler) mappings.get(type);
140: }
141: }
142: }
143:
144: /*
145: * (c) Copyright 2005, 2006, 2007, 2008 Hewlett-Packard Development Company, LP
146: * All rights reserved.
147: *
148: * Redistribution and use in source and binary forms, with or without
149: * modification, are permitted provided that the following conditions
150: * are met:
151: * 1. Redistributions of source code must retain the above copyright
152: * notice, this list of conditions and the following disclaimer.
153: * 2. Redistributions in binary form must reproduce the above copyright
154: * notice, this list of conditions and the following disclaimer in the
155: * documentation and/or other materials provided with the distribution.
156: * 3. The name of the author may not be used to endorse or promote products
157: * derived from this software without specific prior written permission.
158: *
159: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
160: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
161: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
162: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
163: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
165: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
166: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
167: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
168: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
169: */
|