Relocated core loader to the proper directory, various formatting and documentation.
git-svn-id: https://svn.libreccm.org/ccm/trunk@2017 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
aa2a964ddf
commit
65576819ba
|
|
@ -23,7 +23,6 @@ import com.arsdigita.db.DbHelper;
|
||||||
import com.arsdigita.domain.DomainObject;
|
import com.arsdigita.domain.DomainObject;
|
||||||
import com.arsdigita.domain.DomainObjectInstantiator;
|
import com.arsdigita.domain.DomainObjectInstantiator;
|
||||||
import com.arsdigita.kernel.ACSObjectInstantiator;
|
import com.arsdigita.kernel.ACSObjectInstantiator;
|
||||||
import com.arsdigita.loader.CoreLoader;
|
|
||||||
import com.arsdigita.mimetypes.MimeType;
|
import com.arsdigita.mimetypes.MimeType;
|
||||||
import com.arsdigita.persistence.DataObject;
|
import com.arsdigita.persistence.DataObject;
|
||||||
import com.arsdigita.persistence.Session;
|
import com.arsdigita.persistence.Session;
|
||||||
|
|
@ -35,25 +34,24 @@ import com.arsdigita.runtime.CompoundInitializer;
|
||||||
import com.arsdigita.runtime.DomainInitEvent;
|
import com.arsdigita.runtime.DomainInitEvent;
|
||||||
import com.arsdigita.runtime.PDLInitializer;
|
import com.arsdigita.runtime.PDLInitializer;
|
||||||
import com.arsdigita.runtime.RuntimeConfig;
|
import com.arsdigita.runtime.RuntimeConfig;
|
||||||
import com.arsdigita.toolbox.CharsetEncodingProvider;
|
|
||||||
import com.arsdigita.ui.admin.Admin;
|
|
||||||
import com.arsdigita.util.URLRewriter;
|
|
||||||
import com.arsdigita.xml.FactoriesSetup;
|
|
||||||
import com.arsdigita.web.Host;
|
|
||||||
// import com.arsdigita.web.WebApp;
|
|
||||||
import com.arsdigita.web.ApplicationType;
|
|
||||||
import com.arsdigita.workflow.simple.TaskComment;
|
|
||||||
import com.arsdigita.search.converter.Converter;
|
import com.arsdigita.search.converter.Converter;
|
||||||
import com.arsdigita.search.converter.ConverterRegistry;
|
import com.arsdigita.search.converter.ConverterRegistry;
|
||||||
import com.arsdigita.search.converter.PDFConverter;
|
|
||||||
import com.arsdigita.search.converter.ExcelConverter;
|
import com.arsdigita.search.converter.ExcelConverter;
|
||||||
import com.arsdigita.search.converter.OOConverter;
|
import com.arsdigita.search.converter.OOConverter;
|
||||||
import com.arsdigita.search.converter.WordConverter;
|
import com.arsdigita.search.converter.PDFConverter;
|
||||||
import com.arsdigita.search.converter.TextConverter;
|
import com.arsdigita.search.converter.TextConverter;
|
||||||
|
import com.arsdigita.search.converter.WordConverter;
|
||||||
|
import com.arsdigita.toolbox.CharsetEncodingProvider;
|
||||||
|
import com.arsdigita.ui.admin.Admin;
|
||||||
import com.arsdigita.ui.login.Login;
|
import com.arsdigita.ui.login.Login;
|
||||||
import com.arsdigita.ui.permissions.Permissions;
|
import com.arsdigita.ui.permissions.Permissions;
|
||||||
|
import com.arsdigita.util.URLRewriter;
|
||||||
|
import com.arsdigita.web.ApplicationType;
|
||||||
|
import com.arsdigita.web.Host;
|
||||||
import com.arsdigita.webdevsupport.WebDevSupport;
|
import com.arsdigita.webdevsupport.WebDevSupport;
|
||||||
|
import com.arsdigita.workflow.simple.TaskComment;
|
||||||
|
import com.arsdigita.xml.FactoriesSetup;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -123,15 +121,6 @@ public class Initializer extends CompoundInitializer {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Status Experimental - not used anywhere in code base.
|
|
||||||
e.getFactory().registerInstantiator
|
|
||||||
(WebApp.BASE_DATA_OBJECT_TYPE,
|
|
||||||
new DomainObjectInstantiator() {
|
|
||||||
public DomainObject doNewInstance(final DataObject data) {
|
|
||||||
return new WebApp(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
e.getFactory().registerInstantiator
|
e.getFactory().registerInstantiator
|
||||||
(TaskComment.BASE_DATA_OBJECT_TYPE,
|
(TaskComment.BASE_DATA_OBJECT_TYPE,
|
||||||
new DomainObjectInstantiator() {
|
new DomainObjectInstantiator() {
|
||||||
|
|
@ -233,7 +222,7 @@ public class Initializer extends CompoundInitializer {
|
||||||
Session session = SessionManager.getSession();
|
Session session = SessionManager.getSession();
|
||||||
TransactionContext txn = session.getTransactionContext();
|
TransactionContext txn = session.getTransactionContext();
|
||||||
txn.beginTxn();
|
txn.beginTxn();
|
||||||
CoreLoader.loadHost();
|
Loader.loadHost();
|
||||||
txn.commitTxn();
|
txn.commitTxn();
|
||||||
|
|
||||||
s_log.info("Core init(DomainInitEvent) done");
|
s_log.info("Core init(DomainInitEvent) done");
|
||||||
|
|
|
||||||
|
|
@ -18,23 +18,672 @@
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.core;
|
package com.arsdigita.core;
|
||||||
|
|
||||||
import com.arsdigita.loader.CoreLoader;
|
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||||
|
import com.arsdigita.globalization.Charset;
|
||||||
|
import com.arsdigita.globalization.Locale;
|
||||||
|
import com.arsdigita.kernel.EmailAddress;
|
||||||
|
import com.arsdigita.kernel.Group;
|
||||||
|
import com.arsdigita.kernel.GroupCollection;
|
||||||
|
import com.arsdigita.kernel.Kernel;
|
||||||
|
import com.arsdigita.kernel.KernelExcursion;
|
||||||
|
import com.arsdigita.kernel.PackageInstance;
|
||||||
|
import com.arsdigita.kernel.PackageType;
|
||||||
|
import com.arsdigita.kernel.ResourceType;
|
||||||
|
import com.arsdigita.kernel.SiteNode;
|
||||||
|
import com.arsdigita.kernel.User;
|
||||||
|
import com.arsdigita.kernel.UserAuthentication;
|
||||||
|
import com.arsdigita.kernel.permissions.PermissionService;
|
||||||
|
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||||
|
import com.arsdigita.kernel.permissions.UniversalPermissionDescriptor;
|
||||||
|
import com.arsdigita.kernel.security.KeyStorage;
|
||||||
|
import com.arsdigita.loader.PackageLoader;
|
||||||
|
import com.arsdigita.mimetypes.ImageMimeType;
|
||||||
|
import com.arsdigita.mimetypes.MimeType;
|
||||||
|
import com.arsdigita.mimetypes.MimeTypeExtension;
|
||||||
|
import com.arsdigita.mimetypes.TextMimeType;
|
||||||
|
import com.arsdigita.portal.Portal;
|
||||||
|
import com.arsdigita.runtime.ConfigError;
|
||||||
|
import com.arsdigita.runtime.ScriptContext;
|
||||||
|
import com.arsdigita.ui.admin.Admin;
|
||||||
|
import com.arsdigita.ui.login.Login;
|
||||||
|
import com.arsdigita.ui.permissions.Permissions;
|
||||||
|
import com.arsdigita.util.Assert;
|
||||||
|
import com.arsdigita.util.StringUtils;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import com.arsdigita.util.parameter.CSVParameterReader;
|
||||||
|
import com.arsdigita.util.parameter.EmailParameter;
|
||||||
|
import com.arsdigita.util.parameter.Parameter;
|
||||||
|
import com.arsdigita.util.parameter.StringArrayParameter;
|
||||||
|
import com.arsdigita.util.parameter.StringParameter;
|
||||||
|
import com.arsdigita.util.servlet.HttpHost;
|
||||||
|
import com.arsdigita.web.Application;
|
||||||
|
import com.arsdigita.web.ApplicationType;
|
||||||
|
import com.arsdigita.web.Host;
|
||||||
|
import com.arsdigita.web.Web;
|
||||||
|
import com.arsdigita.webdevsupport.WebDevSupport;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.mail.internet.InternetAddress;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loader used during the initial setup to load the database, used by
|
* Core Loader
|
||||||
* c.ad.packaging.Load (invoked via "ccm load ..." command)
|
|
||||||
*
|
|
||||||
* The loader is specified in the file "/ccm-core.load" (which follows the
|
|
||||||
* general naming scheme <package-key>.load).
|
|
||||||
*
|
|
||||||
* Currently just a wrapper for Class CoreLoader which does the actual work.
|
|
||||||
*
|
*
|
||||||
* ToDo: Should we move CoreLoader into Loader here for systematic reasons? All
|
* @author Rafael H. Schloming <rhs@mit.edu>
|
||||||
* modules use a class Loader (or sometimes <package>Loader) located in the
|
* @version $Revision: #15 $ $Date: 2004/08/16 $
|
||||||
* base package of the module. Alternatively: put all Loader classes into a
|
* @version $Id: CoreLoader.java 1841 2009-03-05 07:52:42Z terry $
|
||||||
* package "loader".
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class Loader extends CoreLoader {
|
public class Loader extends PackageLoader {
|
||||||
// Empty
|
|
||||||
|
private static final Logger s_log = Logger.getLogger(Loader.class);
|
||||||
|
|
||||||
|
private EmailParameter m_email = new EmailParameter("waf.admin.email");
|
||||||
|
|
||||||
|
private StringParameter m_screen = new StringParameter
|
||||||
|
("waf.admin.name.screen", Parameter.OPTIONAL, null) {
|
||||||
|
@Override
|
||||||
|
public Object getDefaultValue() {
|
||||||
|
String email = getEmail();
|
||||||
|
if (email == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
int index = email.indexOf("@");
|
||||||
|
if (index > 0) {
|
||||||
|
return email.substring(0, index);
|
||||||
|
} else {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private StringParameter m_given = new StringParameter
|
||||||
|
("waf.admin.name.given", Parameter.REQUIRED, null);
|
||||||
|
|
||||||
|
private StringParameter m_family = new StringParameter
|
||||||
|
("waf.admin.name.family", Parameter.REQUIRED, null);
|
||||||
|
|
||||||
|
private StringParameter m_password = new StringParameter
|
||||||
|
("waf.admin.password", Parameter.REQUIRED, null);
|
||||||
|
|
||||||
|
private StringParameter m_question = new StringParameter
|
||||||
|
("waf.admin.password.question", Parameter.REQUIRED, null);
|
||||||
|
|
||||||
|
private StringParameter m_answer = new StringParameter
|
||||||
|
("waf.admin.password.answer", Parameter.REQUIRED, null);
|
||||||
|
|
||||||
|
private StringParameter m_dispatcher = new StringParameter
|
||||||
|
("waf.login.dispatcher", Parameter.OPTIONAL,
|
||||||
|
"com.arsdigita.ui.login.DummyDispatcher");
|
||||||
|
// "com.arsdigita.ui.login.SubsiteDispatcher");
|
||||||
|
|
||||||
|
private StringParameter m_resource = new StringParameter
|
||||||
|
("waf.mime.resource", Parameter.OPTIONAL,
|
||||||
|
"com/arsdigita/core/mimetypes.properties");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recognized character sets
|
||||||
|
*/
|
||||||
|
// In Old Initializer: CHARSETS as List.class
|
||||||
|
// charsets = {"ISO-8859-1","UTF-8"};
|
||||||
|
private final Parameter m_charsets =
|
||||||
|
new StringArrayParameter(
|
||||||
|
"waf.globalization.charsets",
|
||||||
|
Parameter.REQUIRED,
|
||||||
|
new String[] { "ISO-8859-1","UTF-8" }
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Each entry in the "locales" list is a 4-tuple of the form
|
||||||
|
* {language, country, variant, charset}
|
||||||
|
* The charset must be one of the values specified in the "charsets"
|
||||||
|
* parameter above.
|
||||||
|
*
|
||||||
|
* This parameter is only read once in the initial loading step and stored
|
||||||
|
* in the database (g11n_locales). Subsequent modifications will have no effect!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// In OLD Initializer: LOCALES as List.class
|
||||||
|
private final Parameter m_locales =
|
||||||
|
new StringArrayParameter(
|
||||||
|
"waf.globalization.locales",
|
||||||
|
Parameter.REQUIRED,
|
||||||
|
new String[] {"en: : :UTF-8","en:GB: :UTF-8","en:US: :UTF-8"
|
||||||
|
,"es: : :UTF-8","es:ES: :UTF-8"
|
||||||
|
,"da: : :UTF-8","da:DK: :UTF-8"
|
||||||
|
,"de: : :UTF-8","de:DE: :UTF-8"
|
||||||
|
,"fr: : :UTF-8","fr:FR: :UTF-8"
|
||||||
|
,"ru: : :UTF-8"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
public Loader() {
|
||||||
|
register(m_email);
|
||||||
|
register(m_screen);
|
||||||
|
register(m_given);
|
||||||
|
register(m_family);
|
||||||
|
register(m_password);
|
||||||
|
register(m_question);
|
||||||
|
register(m_answer);
|
||||||
|
register(m_dispatcher);
|
||||||
|
register(m_resource);
|
||||||
|
register(m_charsets);
|
||||||
|
register(m_locales);
|
||||||
|
|
||||||
|
loadInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEmail() {
|
||||||
|
return ((InternetAddress) get(m_email)).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getScreen() {
|
||||||
|
return (String) get(m_screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getGiven() {
|
||||||
|
return (String) get(m_given);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getFamily() {
|
||||||
|
return (String) get(m_family);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPassword() {
|
||||||
|
return (String) get(m_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getQuestion() {
|
||||||
|
return (String) get(m_question);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getAnswer() {
|
||||||
|
return (String) get(m_answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDispatcher() {
|
||||||
|
return (String) get(m_dispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResource() {
|
||||||
|
return (String) get(m_resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve systems recognized character sets.
|
||||||
|
*
|
||||||
|
* @return List of recognized character sets.
|
||||||
|
*/
|
||||||
|
private List getCharsets() {
|
||||||
|
String[] charsets = (String[]) get(m_charsets) ;
|
||||||
|
return (List) Arrays.asList(charsets) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the list of supported locales
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private List getLocales() {
|
||||||
|
|
||||||
|
/** Value of the locales parameter, a string array of
|
||||||
|
4-tuple of locale values (see above) */
|
||||||
|
String[] locales = (String[]) get(m_locales) ;
|
||||||
|
|
||||||
|
if (locales != null) {
|
||||||
|
ArrayList localeTupel = new ArrayList();
|
||||||
|
for (int i = 0; i < locales.length ; ++i) {
|
||||||
|
String[] localeSet = StringUtils.split(locales[i],':');
|
||||||
|
localeTupel.add(Arrays.asList(localeSet));
|
||||||
|
}
|
||||||
|
return localeTupel;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(final ScriptContext ctx) {
|
||||||
|
s_log.debug("CoreLoader run method started.");
|
||||||
|
new KernelExcursion() {
|
||||||
|
public void excurse() {
|
||||||
|
setEffectiveParty(Kernel.getSystemParty());
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to init KeyStorage.");
|
||||||
|
KeyStorage.KERNEL_KEY_STORE.init();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadHost().");
|
||||||
|
loadHost();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadSubsite().");
|
||||||
|
loadSubsite(loadKernel());
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadLoginApp().");
|
||||||
|
loadLoginApp();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadAdminApp().");
|
||||||
|
loadAdminApp();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadPermissionsApp().");
|
||||||
|
loadPermissionsApp(); // new style legacy free
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadWebDev().");
|
||||||
|
loadWebDev(); // new style legacy free
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadPortal().");
|
||||||
|
loadPortal();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadMimeTypes().");
|
||||||
|
loadMimeTypes();
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to execute loadGlobalization().");
|
||||||
|
loadGlobalization();
|
||||||
|
|
||||||
|
}
|
||||||
|
}.run();
|
||||||
|
s_log.debug("CoreLoader run method completed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subject to change.
|
||||||
|
*/
|
||||||
|
public static void loadHost() {
|
||||||
|
|
||||||
|
final HttpHost hhost = Web.getConfig().getHost();
|
||||||
|
Assert.exists(hhost, HttpHost.class);
|
||||||
|
|
||||||
|
final Host host = Host.retrieve(hhost);
|
||||||
|
|
||||||
|
if (host == null) {
|
||||||
|
Host.create(hhost.getName(), hhost.getPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loader for lucene search engine.
|
||||||
|
// Used to invoke static class LoaderImpl - method load() in
|
||||||
|
// com.arsdigita.search.lucene.IndexId. Same procedure is invoked by
|
||||||
|
// the initializer each time the system starts. So it's redundant here.
|
||||||
|
// Using initializer code is favourable because it may be conditionally
|
||||||
|
// performed, depending on configuration (Lucene or Intermedia).
|
||||||
|
// But the currently given implementation requires the loader
|
||||||
|
// instruction here to let the code initialization time (i.e. at each
|
||||||
|
// startup) work properly. If left out here instantiation in
|
||||||
|
// c.ad.search.lucene.Initializer (public final static Loader LOADER)
|
||||||
|
// doesn't work!
|
||||||
|
com.arsdigita.search.lucene.Initializer.LOADER.load();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param rootNode
|
||||||
|
* @deprecated will be removed without replacement. Naot needed anymore
|
||||||
|
*/
|
||||||
|
private void loadSubsite(SiteNode rootNode) {
|
||||||
|
s_log.debug("CoreLoader: Going to execute method loadSubsite().");
|
||||||
|
String sDispatcher = "";
|
||||||
|
|
||||||
|
PackageInstance packageInstance = rootNode.getPackageInstance();
|
||||||
|
if (packageInstance == null) {
|
||||||
|
throw new IllegalStateException
|
||||||
|
("No package instance mounted at the root node");
|
||||||
|
}
|
||||||
|
PackageType subsite = packageInstance.getType();
|
||||||
|
|
||||||
|
// getType() returns a disconnected object. To get a connected object
|
||||||
|
// we do a findByKey(key).
|
||||||
|
String packageKey = subsite.getKey();
|
||||||
|
try {
|
||||||
|
subsite = PackageType.findByKey(packageKey);
|
||||||
|
} catch (DataObjectNotFoundException e) {
|
||||||
|
throw new IllegalStateException
|
||||||
|
("Package Type with key \"" + packageKey + "\" was not found.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set subsite dispatcher class.
|
||||||
|
subsite.setDispatcherClass(getDispatcher());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Root Site Node for loadSubsite()
|
||||||
|
* @return root node
|
||||||
|
* @deprecated will be removed without replacement. Naot needed anymore
|
||||||
|
*/
|
||||||
|
private SiteNode loadKernel() {
|
||||||
|
// Create Root Site Node
|
||||||
|
s_log.debug("CoreLoader: Going to execute method loadKernel().");
|
||||||
|
|
||||||
|
final SiteNode rootNode = SiteNode.createSiteNode(null, null);
|
||||||
|
s_log.debug("loadKernel: creating system administrator.");
|
||||||
|
createSystemAdministrator();
|
||||||
|
|
||||||
|
// Create Package Types and Instances
|
||||||
|
s_log.debug("loadKernel: creating Package Types and Instances.");
|
||||||
|
PackageType subsite = PackageType.create
|
||||||
|
("acs-subsite", "ACS Subsite", "ACS Subsites",
|
||||||
|
"http://arsdigita.com/acs-subsite/");
|
||||||
|
PackageInstance subsiteInstance = subsite.createInstance("Main Site");
|
||||||
|
|
||||||
|
// Mount instances.
|
||||||
|
s_log.debug("loadKernel: mount Instances.");
|
||||||
|
rootNode.mountPackage(subsiteInstance);
|
||||||
|
|
||||||
|
s_log.debug("CoreLoader: Going to complete method loadKernel().");
|
||||||
|
return rootNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that at least one User with universal "admin" permission exists
|
||||||
|
* after installation.
|
||||||
|
*/
|
||||||
|
private void createSystemAdministrator() {
|
||||||
|
s_log.debug("CoreLoader: execution of method createSystemAdministrator().");
|
||||||
|
final String DO_NOT_CREATE = "*do not create*";
|
||||||
|
|
||||||
|
String emailAddress = getEmail();
|
||||||
|
String screenName = getScreen();
|
||||||
|
String givenName = getGiven();
|
||||||
|
String familyName = getFamily();
|
||||||
|
String password = getPassword();
|
||||||
|
String passwordQuestion = getQuestion();
|
||||||
|
String passwordAnswer = getAnswer();
|
||||||
|
s_log.debug("createSystemAdministrator: EmailAddr: " + emailAddress +
|
||||||
|
"\n screenName: " + screenName +
|
||||||
|
"\n givenName: " + givenName );
|
||||||
|
|
||||||
|
// Allow not creating system administrator account.
|
||||||
|
// (Specified by setting parameter
|
||||||
|
// systemAdministratorEmailAddress = "*do not create*").
|
||||||
|
// This enables the administrator account to be made using
|
||||||
|
// other initializers (e.g. LDAP).
|
||||||
|
|
||||||
|
if (emailAddress.equals(DO_NOT_CREATE)) {
|
||||||
|
s_log.warn("WARNING: System administrator account not created "
|
||||||
|
+ "because email set to '*do not create*'.\n This "
|
||||||
|
+ "will cause problems *unless* account is setup "
|
||||||
|
+ "another way (for example, by an LDAP initializer).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the system administrator user.
|
||||||
|
|
||||||
|
s_log.debug("createSystemAdministrator(): going to create new User.");
|
||||||
|
User sa = new User();
|
||||||
|
sa.setPrimaryEmail(new EmailAddress(emailAddress));
|
||||||
|
if (screenName != null &&
|
||||||
|
screenName.length() > 0) {
|
||||||
|
sa.setScreenName(screenName);
|
||||||
|
}
|
||||||
|
sa.getPersonName().setGivenName(givenName);
|
||||||
|
sa.getPersonName().setFamilyName(familyName);
|
||||||
|
|
||||||
|
// Save the system administrator's authentication credentials.
|
||||||
|
s_log.debug("createSystemAdministrator(): going to save credentials.");
|
||||||
|
UserAuthentication auth = UserAuthentication.createForUser(sa);
|
||||||
|
auth.setPassword(password);
|
||||||
|
auth.setPasswordQuestion(passwordQuestion);
|
||||||
|
auth.setPasswordAnswer(passwordAnswer);
|
||||||
|
|
||||||
|
// Grant the system administrator universal "admin" permission.
|
||||||
|
|
||||||
|
s_log.debug("createSystemAdministrator(): going to grant admin perms.");
|
||||||
|
PermissionService.grantPermission
|
||||||
|
(new UniversalPermissionDescriptor
|
||||||
|
(PrivilegeDescriptor.ADMIN, sa));
|
||||||
|
|
||||||
|
// Add system administrator to site-wide administrator group
|
||||||
|
GroupCollection groupColl = Group.retrieveAll();
|
||||||
|
// FIXME: String for Site-wide Admininistrators is hardcoded because
|
||||||
|
// this group in inserted via sql-command during setup
|
||||||
|
groupColl.filter("Site-wide Administrators");
|
||||||
|
if(groupColl.next()) {
|
||||||
|
groupColl.getGroup().addMember(sa);
|
||||||
|
}
|
||||||
|
groupColl.close();
|
||||||
|
|
||||||
|
s_log.debug("Adding administrator: \"" + givenName + " " +
|
||||||
|
familyName + "\" <" + emailAddress + ">");
|
||||||
|
s_log.debug("CoreLoader: method createSystemAdministrator() completed.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup Login application. Loads type into database and instances the
|
||||||
|
* single default instance.
|
||||||
|
* Has to be public access in order to enable script Upgrade664 to use it.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static void loadLoginApp() {
|
||||||
|
|
||||||
|
ApplicationType loginType =
|
||||||
|
new ApplicationType("login",
|
||||||
|
Login.BASE_DATA_OBJECT_TYPE );
|
||||||
|
loginType.setDescription("CCM user login application");
|
||||||
|
loginType.save();
|
||||||
|
|
||||||
|
|
||||||
|
Application login = Application.createApplication(loginType,
|
||||||
|
"register",
|
||||||
|
"CCM Login",
|
||||||
|
null);
|
||||||
|
login.setDescription("CCM login instance");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup core Admin application. Loads type into database and instances the
|
||||||
|
* single default instance.
|
||||||
|
* Has to be public access in order to enable script Upgrade664 to use it.
|
||||||
|
*/
|
||||||
|
public static void loadAdminApp() {
|
||||||
|
|
||||||
|
ApplicationType adminType =
|
||||||
|
new ApplicationType("admin",
|
||||||
|
Admin.BASE_DATA_OBJECT_TYPE );
|
||||||
|
adminType.setDescription("CCM user and group administration");
|
||||||
|
adminType.save();
|
||||||
|
|
||||||
|
|
||||||
|
Application admin = Application.createApplication(adminType,
|
||||||
|
"admin",
|
||||||
|
"CCM Admin",
|
||||||
|
null);
|
||||||
|
admin.setDescription("CCM user and group administration instance");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup core Admin application. Loads type into database and instances the
|
||||||
|
* single default instance.
|
||||||
|
* Has to be public access in order to enable script Upgrade664 to use it.
|
||||||
|
*/
|
||||||
|
public static void loadPermissionsApp() {
|
||||||
|
|
||||||
|
/* NOTE:
|
||||||
|
* The wording in the title parameter of ApplicationType determines
|
||||||
|
* the name of the subdirectory for the XSL stylesheets.
|
||||||
|
* It gets "urlized", i.e. trimming leading and trailing blanks and
|
||||||
|
* replacing blanks between words and illegal characters with an hyphen
|
||||||
|
* and converted to lower case.
|
||||||
|
* Example: "Permissions" will become "permissions".
|
||||||
|
*/
|
||||||
|
ApplicationType type =
|
||||||
|
new ApplicationType("Permissions",
|
||||||
|
Permissions.BASE_DATA_OBJECT_TYPE );
|
||||||
|
type.setDescription("CCM permissions administration");
|
||||||
|
type.save();
|
||||||
|
|
||||||
|
Application app = Application.createApplication(type,
|
||||||
|
"permissions",
|
||||||
|
"CCM Permissions",
|
||||||
|
null);
|
||||||
|
app.setDescription("CCM permissions administration instance");
|
||||||
|
app.save();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads WebDeveloperSupport as a new style, legacy free application into
|
||||||
|
* database and instantiate the (only) application instance.
|
||||||
|
*
|
||||||
|
* Public static access needed by upgrade script Upgrade664
|
||||||
|
* @return webDevType ApplicationType
|
||||||
|
*/
|
||||||
|
public static void loadWebDev() {
|
||||||
|
|
||||||
|
ApplicationType webDevType =
|
||||||
|
new ApplicationType("WebDev Support",
|
||||||
|
WebDevSupport.BASE_DATA_OBJECT_TYPE );
|
||||||
|
webDevType.setDescription("WebDeveloper Support application");
|
||||||
|
webDevType.save();
|
||||||
|
|
||||||
|
Application webDev = Application.createApplication(webDevType,
|
||||||
|
"ds",
|
||||||
|
"WebDeveloper Support",
|
||||||
|
null);
|
||||||
|
webDev.setDescription("The default WEB developer service instance.");
|
||||||
|
webDev.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load core's basic portal infrastructure.
|
||||||
|
*/
|
||||||
|
private void loadPortal() {
|
||||||
|
s_log.info("Adding resource type: portal");
|
||||||
|
// ResourceType manages the entries in table application_types and
|
||||||
|
// therefore actually creates a sort of new style legacy free
|
||||||
|
// application type
|
||||||
|
ResourceType type = ResourceType.createResourceType
|
||||||
|
("Portal", Portal.BASE_DATA_OBJECT_TYPE);
|
||||||
|
type.setDescription("A Portal!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads supported mime types from a file and ???.
|
||||||
|
*
|
||||||
|
* Run once during initial load.
|
||||||
|
*/
|
||||||
|
private void loadMimeTypes() {
|
||||||
|
ClassLoader cload = Thread.currentThread().getContextClassLoader();
|
||||||
|
// get filename containing supported mime types as comma separated list
|
||||||
|
String resource = getResource();
|
||||||
|
InputStream is = cload.getResourceAsStream(resource);
|
||||||
|
if (is == null) {
|
||||||
|
throw new IllegalStateException("no such resource: " + resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
MimeTypeRow row = new MimeTypeRow();
|
||||||
|
CSVParameterReader loader = new CSVParameterReader
|
||||||
|
(new InputStreamReader(is), row.getParameters());
|
||||||
|
|
||||||
|
while (loader.next()) {
|
||||||
|
|
||||||
|
row.load(loader);
|
||||||
|
|
||||||
|
s_log.info("Adding mimetype: " + row.getType() + " (" +
|
||||||
|
row.getLabel() + ")");
|
||||||
|
MimeType mime = MimeType.createMimeType
|
||||||
|
(row.getType(), row.getJavaClass(), row.getObjectType());
|
||||||
|
mime.setLabel(row.getLabel());
|
||||||
|
mime.setFileExtension(row.getDefaultExtension());
|
||||||
|
|
||||||
|
if (mime instanceof TextMimeType) {
|
||||||
|
((TextMimeType) mime).setAllowINSOConvert
|
||||||
|
("1".equals(row.getSizerOrINSO()));
|
||||||
|
}
|
||||||
|
if (mime instanceof ImageMimeType) {
|
||||||
|
((ImageMimeType) mime).setImageSizer(row.getSizerOrINSO());
|
||||||
|
}
|
||||||
|
String[] extensions =
|
||||||
|
StringUtils.split(row.getExtensions(), ',');
|
||||||
|
for (int i = 0; i < extensions.length; i++) {
|
||||||
|
MimeTypeExtension ext =
|
||||||
|
MimeTypeExtension.create(extensions[i],
|
||||||
|
mime.getMimeType());
|
||||||
|
ext.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
try { is.close(); }
|
||||||
|
catch (IOException e) { throw new UncheckedWrapperException(e); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadGlobalization() throws ConfigError {
|
||||||
|
List charsets = (List) getCharsets();
|
||||||
|
if ( charsets == null ) {
|
||||||
|
throw new ConfigError
|
||||||
|
("You must specify at least one charset in the m_charsets " +
|
||||||
|
"parameter of the core loader parameter section. " +
|
||||||
|
"UTF-8 would be a good first choice.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map charsetMap = new HashMap();
|
||||||
|
|
||||||
|
for (Iterator i=charsets.iterator(); i.hasNext(); ) {
|
||||||
|
String charsetName = (String) i.next();
|
||||||
|
s_log.debug("Dealing with charset name: " + charsetName );
|
||||||
|
|
||||||
|
// Check if this is a valid charset. Is there a better way to do
|
||||||
|
// this? - vadimn@redhat.com, Mon 2002-07-29 14:47:41 -0400
|
||||||
|
try {
|
||||||
|
new OutputStreamWriter(new ByteArrayOutputStream(), charsetName);
|
||||||
|
} catch (UnsupportedEncodingException ex) {
|
||||||
|
throw new ConfigError
|
||||||
|
(charsetName + " is not a supported charset");
|
||||||
|
}
|
||||||
|
Charset charset = new Charset();
|
||||||
|
charset.setCharset(charsetName);
|
||||||
|
charset.save();
|
||||||
|
charsetMap.put(charsetName, charset);
|
||||||
|
}
|
||||||
|
|
||||||
|
List locales = (List) getLocales();
|
||||||
|
|
||||||
|
if ( locales == null ) {
|
||||||
|
throw new ConfigError
|
||||||
|
("You must specify at least one locale in the m_locales " +
|
||||||
|
"parameter of core loader parameter section. " +
|
||||||
|
"The \"en\" locale is probably required.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Iterator i=locales.iterator(); i.hasNext(); ) {
|
||||||
|
List localeData = (List) i.next();
|
||||||
|
String language = (String) localeData.get(0);
|
||||||
|
String country = (String) localeData.get(1);
|
||||||
|
String variant = (String) localeData.get(2);
|
||||||
|
String charsetName = (String) localeData.get(3);
|
||||||
|
Locale locale = new Locale(language, country, variant);
|
||||||
|
|
||||||
|
Charset defaultCharset = (Charset) charsetMap.get(charsetName);
|
||||||
|
if ( defaultCharset == null ) {
|
||||||
|
throw new ConfigError
|
||||||
|
("You must list " + charsetName + " in the \"m_charsets\" " +
|
||||||
|
"parameter before using it in the \"m_locales\" " +
|
||||||
|
"\" parameter.");
|
||||||
|
}
|
||||||
|
locale.setDefaultCharset(defaultCharset);
|
||||||
|
locale.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loader used during the initial setup to load the database, used by
|
||||||
|
* c.ad.packaging.Load (invoked via "ccm load ..." command)
|
||||||
|
*
|
||||||
|
* The loader is specified in the file "/ccm-core.load" (which follows the
|
||||||
|
* general naming scheme <package-key>.load).
|
||||||
|
*
|
||||||
|
* Currently just a wrapper for Class CoreLoader which does the actual work.
|
||||||
|
*
|
||||||
|
* ToDo: Should we move CoreLoader into Loader here for systematic reasons? All
|
||||||
|
* modules use a class Loader (or sometimes <package>Loader) located in the
|
||||||
|
* base package of the module. Alternatively: put all Loader classes into a
|
||||||
|
* package "loader".
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public final class Loader extends CoreLoader {
|
||||||
|
// Empty
|
||||||
|
}
|
||||||
|
|
@ -16,12 +16,10 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.loader;
|
package com.arsdigita.core;
|
||||||
|
|
||||||
import com.arsdigita.runtime.AbstractConfig;
|
import com.arsdigita.runtime.AbstractConfig;
|
||||||
import com.arsdigita.util.parameter.Parameter;
|
import com.arsdigita.util.parameter.Parameter;
|
||||||
// deprecated: import com.arsdigita.util.parameter.ParameterRecord;
|
|
||||||
// replaced by c.ad.rt.AbstractConfig, should be deleted after testing
|
|
||||||
import com.arsdigita.util.parameter.StringParameter;
|
import com.arsdigita.util.parameter.StringParameter;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
package com.arsdigita.core.upgrade;
|
package com.arsdigita.core.upgrade;
|
||||||
|
|
||||||
import com.arsdigita.loader.CoreLoader;
|
import com.arsdigita.core.Loader;
|
||||||
import com.arsdigita.kernel.Kernel;
|
import com.arsdigita.kernel.Kernel;
|
||||||
import com.arsdigita.kernel.KernelExcursion;
|
import com.arsdigita.kernel.KernelExcursion;
|
||||||
import com.arsdigita.util.cmd.Program;
|
import com.arsdigita.util.cmd.Program;
|
||||||
|
|
@ -90,28 +90,28 @@ public class Upgrade664 extends Program {
|
||||||
// Previously login had been managed by a (virtual) root
|
// Previously login had been managed by a (virtual) root
|
||||||
// sitenode with login dispatcher associated.
|
// sitenode with login dispatcher associated.
|
||||||
// Login application is newly created, old sitenote deactivated.
|
// Login application is newly created, old sitenote deactivated.
|
||||||
CoreLoader.loadLoginApp();
|
Loader.loadLoginApp();
|
||||||
|
|
||||||
|
|
||||||
// Update core Admin application
|
// Update core Admin application
|
||||||
// Old style package type already removed by sql script.
|
// Old style package type already removed by sql script.
|
||||||
// Create a (new type, legacy free) web.ApplicationType type
|
// Create a (new type, legacy free) web.ApplicationType type
|
||||||
// application
|
// application
|
||||||
CoreLoader.loadAdminApp();
|
Loader.loadAdminApp();
|
||||||
|
|
||||||
|
|
||||||
// Update core permission support
|
// Update core permission support
|
||||||
// Old style package type already removed by sql script.
|
// Old style package type already removed by sql script.
|
||||||
// Create a (new type, legacy free) web.ApplicationType type
|
// Create a (new type, legacy free) web.ApplicationType type
|
||||||
// application
|
// application
|
||||||
CoreLoader.loadPermissionsApp();
|
Loader.loadPermissionsApp();
|
||||||
|
|
||||||
|
|
||||||
// Update core WebDeveloperSupport
|
// Update core WebDeveloperSupport
|
||||||
// Old style package type already removed by sql script.
|
// Old style package type already removed by sql script.
|
||||||
// Create a (new type, legacy free) web.ApplicationType type
|
// Create a (new type, legacy free) web.ApplicationType type
|
||||||
// application
|
// application
|
||||||
CoreLoader.loadWebDev();
|
Loader.loadWebDev();
|
||||||
|
|
||||||
|
|
||||||
// Note: Old PackageType sitenode removed. It's useless now
|
// Note: Old PackageType sitenode removed. It's useless now
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,8 @@ package com.arsdigita.kernel;
|
||||||
|
|
||||||
import com.arsdigita.developersupport.DeveloperSupport;
|
import com.arsdigita.developersupport.DeveloperSupport;
|
||||||
import com.arsdigita.domain.DomainObject;
|
import com.arsdigita.domain.DomainObject;
|
||||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
|
||||||
import com.arsdigita.kernel.permissions.PermissionManager;
|
import com.arsdigita.kernel.permissions.PermissionManager;
|
||||||
|
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||||
import com.arsdigita.persistence.DataObject;
|
import com.arsdigita.persistence.DataObject;
|
||||||
import com.arsdigita.persistence.OID;
|
import com.arsdigita.persistence.OID;
|
||||||
import com.arsdigita.runtime.ContextInitEvent;
|
import com.arsdigita.runtime.ContextInitEvent;
|
||||||
|
|
|
||||||
|
|
@ -1,690 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2.1 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.arsdigita.loader;
|
|
||||||
|
|
||||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
|
||||||
import com.arsdigita.globalization.Charset;
|
|
||||||
import com.arsdigita.globalization.Locale;
|
|
||||||
import com.arsdigita.kernel.EmailAddress;
|
|
||||||
import com.arsdigita.kernel.Group;
|
|
||||||
import com.arsdigita.kernel.GroupCollection;
|
|
||||||
import com.arsdigita.kernel.Kernel;
|
|
||||||
import com.arsdigita.kernel.KernelExcursion;
|
|
||||||
import com.arsdigita.kernel.PackageInstance;
|
|
||||||
import com.arsdigita.kernel.PackageType;
|
|
||||||
import com.arsdigita.kernel.ResourceType;
|
|
||||||
import com.arsdigita.kernel.SiteNode;
|
|
||||||
import com.arsdigita.kernel.User;
|
|
||||||
import com.arsdigita.kernel.UserAuthentication;
|
|
||||||
import com.arsdigita.kernel.permissions.PermissionService;
|
|
||||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
|
||||||
import com.arsdigita.kernel.permissions.UniversalPermissionDescriptor;
|
|
||||||
import com.arsdigita.kernel.security.KeyStorage;
|
|
||||||
import com.arsdigita.mimetypes.ImageMimeType;
|
|
||||||
import com.arsdigita.mimetypes.MimeType;
|
|
||||||
import com.arsdigita.mimetypes.MimeTypeExtension;
|
|
||||||
import com.arsdigita.mimetypes.TextMimeType;
|
|
||||||
import com.arsdigita.portal.Portal;
|
|
||||||
import com.arsdigita.runtime.ConfigError;
|
|
||||||
import com.arsdigita.runtime.ScriptContext;
|
|
||||||
import com.arsdigita.ui.admin.Admin;
|
|
||||||
import com.arsdigita.ui.login.Login;
|
|
||||||
import com.arsdigita.ui.permissions.Permissions;
|
|
||||||
import com.arsdigita.util.Assert;
|
|
||||||
import com.arsdigita.util.StringUtils;
|
|
||||||
import com.arsdigita.util.UncheckedWrapperException;
|
|
||||||
import com.arsdigita.util.parameter.CSVParameterReader;
|
|
||||||
import com.arsdigita.util.parameter.EmailParameter;
|
|
||||||
import com.arsdigita.util.parameter.Parameter;
|
|
||||||
import com.arsdigita.util.parameter.StringArrayParameter;
|
|
||||||
import com.arsdigita.util.parameter.StringParameter;
|
|
||||||
import com.arsdigita.util.servlet.HttpHost;
|
|
||||||
import com.arsdigita.web.Application;
|
|
||||||
import com.arsdigita.web.ApplicationType;
|
|
||||||
import com.arsdigita.web.Host;
|
|
||||||
import com.arsdigita.web.Web;
|
|
||||||
import com.arsdigita.webdevsupport.WebDevSupport;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.mail.internet.InternetAddress;
|
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CoreLoader
|
|
||||||
*
|
|
||||||
* @author Rafael H. Schloming <rhs@mit.edu>
|
|
||||||
* @version $Revision: #15 $ $Date: 2004/08/16 $
|
|
||||||
* @version $Id: CoreLoader.java 1841 2009-03-05 07:52:42Z terry $
|
|
||||||
*/
|
|
||||||
public class CoreLoader extends PackageLoader {
|
|
||||||
|
|
||||||
private static final Logger s_log = Logger.getLogger(CoreLoader.class);
|
|
||||||
|
|
||||||
private EmailParameter m_email = new EmailParameter("waf.admin.email");
|
|
||||||
|
|
||||||
private StringParameter m_screen = new StringParameter
|
|
||||||
("waf.admin.name.screen", Parameter.OPTIONAL, null) {
|
|
||||||
@Override
|
|
||||||
public Object getDefaultValue() {
|
|
||||||
String email = getEmail();
|
|
||||||
if (email == null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
int index = email.indexOf("@");
|
|
||||||
if (index > 0) {
|
|
||||||
return email.substring(0, index);
|
|
||||||
} else {
|
|
||||||
return email;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private StringParameter m_given = new StringParameter
|
|
||||||
("waf.admin.name.given", Parameter.REQUIRED, null);
|
|
||||||
|
|
||||||
private StringParameter m_family = new StringParameter
|
|
||||||
("waf.admin.name.family", Parameter.REQUIRED, null);
|
|
||||||
|
|
||||||
private StringParameter m_password = new StringParameter
|
|
||||||
("waf.admin.password", Parameter.REQUIRED, null);
|
|
||||||
|
|
||||||
private StringParameter m_question = new StringParameter
|
|
||||||
("waf.admin.password.question", Parameter.REQUIRED, null);
|
|
||||||
|
|
||||||
private StringParameter m_answer = new StringParameter
|
|
||||||
("waf.admin.password.answer", Parameter.REQUIRED, null);
|
|
||||||
|
|
||||||
private StringParameter m_dispatcher = new StringParameter
|
|
||||||
("waf.login.dispatcher", Parameter.OPTIONAL,
|
|
||||||
"com.arsdigita.ui.login.DummyDispatcher");
|
|
||||||
// "com.arsdigita.ui.login.SubsiteDispatcher");
|
|
||||||
|
|
||||||
private StringParameter m_resource = new StringParameter
|
|
||||||
("waf.mime.resource", Parameter.OPTIONAL,
|
|
||||||
"com/arsdigita/loader/mimetypes.properties");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recognized character sets
|
|
||||||
*/
|
|
||||||
// In Old Initializer: CHARSETS as List.class
|
|
||||||
// charsets = {"ISO-8859-1","UTF-8"};
|
|
||||||
private final Parameter m_charsets =
|
|
||||||
new StringArrayParameter(
|
|
||||||
"waf.globalization.charsets",
|
|
||||||
Parameter.REQUIRED,
|
|
||||||
new String[] { "ISO-8859-1","UTF-8" }
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Each entry in the "locales" list is a 4-tuple of the form
|
|
||||||
* {language, country, variant, charset}
|
|
||||||
* The charset must be one of the values specified in the "charsets"
|
|
||||||
* parameter above.
|
|
||||||
*
|
|
||||||
* This parameter is only read once in the initial loading step and stored
|
|
||||||
* in the database (g11n_locales). Subsequent modifications will have no effect!
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
// In OLD Initializer: LOCALES as List.class
|
|
||||||
private final Parameter m_locales =
|
|
||||||
new StringArrayParameter(
|
|
||||||
"waf.globalization.locales",
|
|
||||||
Parameter.REQUIRED,
|
|
||||||
new String[] {"en: : :UTF-8","en:GB: :UTF-8","en:US: :UTF-8"
|
|
||||||
,"es: : :UTF-8","es:ES: :UTF-8"
|
|
||||||
,"da: : :UTF-8","da:DK: :UTF-8"
|
|
||||||
,"de: : :UTF-8","de:DE: :UTF-8"
|
|
||||||
,"fr: : :UTF-8","fr:FR: :UTF-8"
|
|
||||||
,"ru: : :UTF-8"
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
public CoreLoader() {
|
|
||||||
register(m_email);
|
|
||||||
register(m_screen);
|
|
||||||
register(m_given);
|
|
||||||
register(m_family);
|
|
||||||
register(m_password);
|
|
||||||
register(m_question);
|
|
||||||
register(m_answer);
|
|
||||||
register(m_dispatcher);
|
|
||||||
register(m_resource);
|
|
||||||
register(m_charsets);
|
|
||||||
register(m_locales);
|
|
||||||
|
|
||||||
loadInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getEmail() {
|
|
||||||
return ((InternetAddress) get(m_email)).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getScreen() {
|
|
||||||
return (String) get(m_screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getGiven() {
|
|
||||||
return (String) get(m_given);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getFamily() {
|
|
||||||
return (String) get(m_family);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getPassword() {
|
|
||||||
return (String) get(m_password);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getQuestion() {
|
|
||||||
return (String) get(m_question);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getAnswer() {
|
|
||||||
return (String) get(m_answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getDispatcher() {
|
|
||||||
return (String) get(m_dispatcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getResource() {
|
|
||||||
return (String) get(m_resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve systems recognized character sets.
|
|
||||||
*
|
|
||||||
* @return List of recognized character sets.
|
|
||||||
*/
|
|
||||||
private List getCharsets() {
|
|
||||||
String[] charsets = (String[]) get(m_charsets) ;
|
|
||||||
return (List) Arrays.asList(charsets) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the list of supported locales
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private List getLocales() {
|
|
||||||
|
|
||||||
/** Value of the locales parameter, a string array of
|
|
||||||
4-tuple of locale values (see above) */
|
|
||||||
String[] locales = (String[]) get(m_locales) ;
|
|
||||||
|
|
||||||
if (locales != null) {
|
|
||||||
ArrayList localeTupel = new ArrayList();
|
|
||||||
for (int i = 0; i < locales.length ; ++i) {
|
|
||||||
String[] localeSet = StringUtils.split(locales[i],':');
|
|
||||||
localeTupel.add(Arrays.asList(localeSet));
|
|
||||||
}
|
|
||||||
return localeTupel;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run(final ScriptContext ctx) {
|
|
||||||
s_log.debug("CoreLoader run method started.");
|
|
||||||
new KernelExcursion() {
|
|
||||||
public void excurse() {
|
|
||||||
setEffectiveParty(Kernel.getSystemParty());
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to init KeyStorage.");
|
|
||||||
KeyStorage.KERNEL_KEY_STORE.init();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadHost().");
|
|
||||||
loadHost();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadSubsite().");
|
|
||||||
loadSubsite(loadKernel());
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadLoginApp().");
|
|
||||||
loadLoginApp();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadAdminApp().");
|
|
||||||
loadAdminApp();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadPermissionsApp().");
|
|
||||||
loadPermissionsApp(); // new style legacy free
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadWebDev().");
|
|
||||||
loadWebDev(); // new style legacy free
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadPortal().");
|
|
||||||
loadPortal();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadMimeTypes().");
|
|
||||||
loadMimeTypes();
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to execute loadGlobalization().");
|
|
||||||
loadGlobalization();
|
|
||||||
|
|
||||||
}
|
|
||||||
}.run();
|
|
||||||
s_log.debug("CoreLoader run method completed.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Subject to change.
|
|
||||||
*/
|
|
||||||
public static void loadHost() {
|
|
||||||
|
|
||||||
final HttpHost hhost = Web.getConfig().getHost();
|
|
||||||
Assert.exists(hhost, HttpHost.class);
|
|
||||||
|
|
||||||
final Host host = Host.retrieve(hhost);
|
|
||||||
|
|
||||||
if (host == null) {
|
|
||||||
Host.create(hhost.getName(), hhost.getPort());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loader for lucene search engine.
|
|
||||||
// Used to invoke static class LoaderImpl - method load() in
|
|
||||||
// com.arsdigita.search.lucene.IndexId. Same procedure is invoked by
|
|
||||||
// the initializer each time the system starts. So it's redundant here.
|
|
||||||
// Using initializer code is favourable because it may be conditionally
|
|
||||||
// performed, depending on configuration (Lucene or Intermedia).
|
|
||||||
// But the currently given implementation requires the loader
|
|
||||||
// instruction here to let the code initialization time (i.e. at each
|
|
||||||
// startup) work properly. If left out here instantiation in
|
|
||||||
// c.ad.search.lucene.Initializer (public final static Loader LOADER)
|
|
||||||
// doesn't work!
|
|
||||||
com.arsdigita.search.lucene.Initializer.LOADER.load();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param rootNode
|
|
||||||
* @deprecated will be removed without replacement. Naot needed anymore
|
|
||||||
*/
|
|
||||||
private void loadSubsite(SiteNode rootNode) {
|
|
||||||
s_log.debug("CoreLoader: Going to execute method loadSubsite().");
|
|
||||||
String sDispatcher = "";
|
|
||||||
|
|
||||||
PackageInstance packageInstance = rootNode.getPackageInstance();
|
|
||||||
if (packageInstance == null) {
|
|
||||||
throw new IllegalStateException
|
|
||||||
("No package instance mounted at the root node");
|
|
||||||
}
|
|
||||||
PackageType subsite = packageInstance.getType();
|
|
||||||
|
|
||||||
// getType() returns a disconnected object. To get a connected object
|
|
||||||
// we do a findByKey(key).
|
|
||||||
String packageKey = subsite.getKey();
|
|
||||||
try {
|
|
||||||
subsite = PackageType.findByKey(packageKey);
|
|
||||||
} catch (DataObjectNotFoundException e) {
|
|
||||||
throw new IllegalStateException
|
|
||||||
("Package Type with key \"" + packageKey + "\" was not found.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set subsite dispatcher class.
|
|
||||||
subsite.setDispatcherClass(getDispatcher());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create Root Site Node for loadSubsite()
|
|
||||||
* @return root node
|
|
||||||
* @deprecated will be removed without replacement. Naot needed anymore
|
|
||||||
*/
|
|
||||||
private SiteNode loadKernel() {
|
|
||||||
// Create Root Site Node
|
|
||||||
s_log.debug("CoreLoader: Going to execute method loadKernel().");
|
|
||||||
|
|
||||||
final SiteNode rootNode = SiteNode.createSiteNode(null, null);
|
|
||||||
s_log.debug("loadKernel: creating system administrator.");
|
|
||||||
createSystemAdministrator();
|
|
||||||
|
|
||||||
// Create Package Types and Instances
|
|
||||||
s_log.debug("loadKernel: creating Package Types and Instances.");
|
|
||||||
PackageType subsite = PackageType.create
|
|
||||||
("acs-subsite", "ACS Subsite", "ACS Subsites",
|
|
||||||
"http://arsdigita.com/acs-subsite/");
|
|
||||||
PackageInstance subsiteInstance = subsite.createInstance("Main Site");
|
|
||||||
|
|
||||||
// Mount instances.
|
|
||||||
s_log.debug("loadKernel: mount Instances.");
|
|
||||||
rootNode.mountPackage(subsiteInstance);
|
|
||||||
|
|
||||||
s_log.debug("CoreLoader: Going to complete method loadKernel().");
|
|
||||||
return rootNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensure that at least one User with universal "admin" permission exists
|
|
||||||
* after installation.
|
|
||||||
*/
|
|
||||||
private void createSystemAdministrator() {
|
|
||||||
s_log.debug("CoreLoader: execution of method createSystemAdministrator().");
|
|
||||||
final String DO_NOT_CREATE = "*do not create*";
|
|
||||||
|
|
||||||
String emailAddress = getEmail();
|
|
||||||
String screenName = getScreen();
|
|
||||||
String givenName = getGiven();
|
|
||||||
String familyName = getFamily();
|
|
||||||
String password = getPassword();
|
|
||||||
String passwordQuestion = getQuestion();
|
|
||||||
String passwordAnswer = getAnswer();
|
|
||||||
s_log.debug("createSystemAdministrator: EmailAddr: " + emailAddress +
|
|
||||||
"\n screenName: " + screenName +
|
|
||||||
"\n givenName: " + givenName );
|
|
||||||
|
|
||||||
// Allow not creating system administrator account.
|
|
||||||
// (Specified by setting parameter
|
|
||||||
// systemAdministratorEmailAddress = "*do not create*").
|
|
||||||
// This enables the administrator account to be made using
|
|
||||||
// other initializers (e.g. LDAP).
|
|
||||||
|
|
||||||
if (emailAddress.equals(DO_NOT_CREATE)) {
|
|
||||||
s_log.warn("WARNING: System administrator account not created "
|
|
||||||
+ "because email set to '*do not create*'.\n This "
|
|
||||||
+ "will cause problems *unless* account is setup "
|
|
||||||
+ "another way (for example, by an LDAP initializer).");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the system administrator user.
|
|
||||||
|
|
||||||
s_log.debug("createSystemAdministrator(): going to create new User.");
|
|
||||||
User sa = new User();
|
|
||||||
sa.setPrimaryEmail(new EmailAddress(emailAddress));
|
|
||||||
if (screenName != null &&
|
|
||||||
screenName.length() > 0) {
|
|
||||||
sa.setScreenName(screenName);
|
|
||||||
}
|
|
||||||
sa.getPersonName().setGivenName(givenName);
|
|
||||||
sa.getPersonName().setFamilyName(familyName);
|
|
||||||
|
|
||||||
// Save the system administrator's authentication credentials.
|
|
||||||
s_log.debug("createSystemAdministrator(): going to save credentials.");
|
|
||||||
UserAuthentication auth = UserAuthentication.createForUser(sa);
|
|
||||||
auth.setPassword(password);
|
|
||||||
auth.setPasswordQuestion(passwordQuestion);
|
|
||||||
auth.setPasswordAnswer(passwordAnswer);
|
|
||||||
|
|
||||||
// Grant the system administrator universal "admin" permission.
|
|
||||||
|
|
||||||
s_log.debug("createSystemAdministrator(): going to grant admin perms.");
|
|
||||||
PermissionService.grantPermission
|
|
||||||
(new UniversalPermissionDescriptor
|
|
||||||
(PrivilegeDescriptor.ADMIN, sa));
|
|
||||||
|
|
||||||
// Add system administrator to site-wide administrator group
|
|
||||||
GroupCollection groupColl = Group.retrieveAll();
|
|
||||||
// FIXME: String for Site-wide Admininistrators is hardcoded because
|
|
||||||
// this group in inserted via sql-command during setup
|
|
||||||
groupColl.filter("Site-wide Administrators");
|
|
||||||
if(groupColl.next()) {
|
|
||||||
groupColl.getGroup().addMember(sa);
|
|
||||||
}
|
|
||||||
groupColl.close();
|
|
||||||
|
|
||||||
s_log.debug("Adding administrator: \"" + givenName + " " +
|
|
||||||
familyName + "\" <" + emailAddress + ">");
|
|
||||||
s_log.debug("CoreLoader: method createSystemAdministrator() completed.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup Login application. Loads type into database and instances the
|
|
||||||
* single default instance.
|
|
||||||
* Has to be public access in order to enable script Upgrade664 to use it.
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static void loadLoginApp() {
|
|
||||||
|
|
||||||
ApplicationType loginType =
|
|
||||||
new ApplicationType("login",
|
|
||||||
Login.BASE_DATA_OBJECT_TYPE );
|
|
||||||
loginType.setDescription("CCM user login application");
|
|
||||||
loginType.save();
|
|
||||||
|
|
||||||
|
|
||||||
Application login = Application.createApplication(loginType,
|
|
||||||
"register",
|
|
||||||
"CCM Login",
|
|
||||||
null);
|
|
||||||
login.setDescription("CCM login instance");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup core Admin application. Loads type into database and instances the
|
|
||||||
* single default instance.
|
|
||||||
* Has to be public access in order to enable script Upgrade664 to use it.
|
|
||||||
*/
|
|
||||||
public static void loadAdminApp() {
|
|
||||||
|
|
||||||
ApplicationType adminType =
|
|
||||||
new ApplicationType("admin",
|
|
||||||
Admin.BASE_DATA_OBJECT_TYPE );
|
|
||||||
adminType.setDescription("CCM user and group administration");
|
|
||||||
adminType.save();
|
|
||||||
|
|
||||||
|
|
||||||
Application admin = Application.createApplication(adminType,
|
|
||||||
"admin",
|
|
||||||
"CCM Admin",
|
|
||||||
null);
|
|
||||||
admin.setDescription("CCM user and group administration instance");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup core Admin application. Loads type into database and instances the
|
|
||||||
* single default instance.
|
|
||||||
* Has to be public access in order to enable script Upgrade664 to use it.
|
|
||||||
*/
|
|
||||||
public static void loadPermissionsApp() {
|
|
||||||
|
|
||||||
/* NOTE:
|
|
||||||
* The wording in the title parameter of ApplicationType determines
|
|
||||||
* the name of the subdirectory for the XSL stylesheets.
|
|
||||||
* It gets "urlized", i.e. trimming leading and trailing blanks and
|
|
||||||
* replacing blanks between words and illegal characters with an hyphen
|
|
||||||
* and converted to lower case.
|
|
||||||
* Example: "Permissions" will become "permissions".
|
|
||||||
*/
|
|
||||||
ApplicationType type =
|
|
||||||
new ApplicationType("Permissions",
|
|
||||||
Permissions.BASE_DATA_OBJECT_TYPE );
|
|
||||||
type.setDescription("CCM permissions administration");
|
|
||||||
type.save();
|
|
||||||
|
|
||||||
Application app = Application.createApplication(type,
|
|
||||||
"permissions",
|
|
||||||
"CCM Permissions",
|
|
||||||
null);
|
|
||||||
app.setDescription("CCM permissions administration instance");
|
|
||||||
app.save();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads WebDeveloperSupport as a new style, legacy free application into
|
|
||||||
* database and instantiate the (only) application instance.
|
|
||||||
*
|
|
||||||
* Public static access needed by upgrade script Upgrade664
|
|
||||||
* @return webDevType ApplicationType
|
|
||||||
*/
|
|
||||||
public static void loadWebDev() {
|
|
||||||
|
|
||||||
ApplicationType webDevType =
|
|
||||||
new ApplicationType("WebDev Support",
|
|
||||||
WebDevSupport.BASE_DATA_OBJECT_TYPE );
|
|
||||||
webDevType.setDescription("WebDeveloper Support application");
|
|
||||||
webDevType.save();
|
|
||||||
|
|
||||||
Application webDev = Application.createApplication(webDevType,
|
|
||||||
"ds",
|
|
||||||
"WebDeveloper Support",
|
|
||||||
null);
|
|
||||||
webDev.setDescription("The default WEB developer service instance.");
|
|
||||||
webDev.save();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load core's basic portal infrastructure.
|
|
||||||
*/
|
|
||||||
private void loadPortal() {
|
|
||||||
s_log.info("Adding resource type: portal");
|
|
||||||
// ResourceType manages the entries in table application_types and
|
|
||||||
// therefore actually creates a sort of new style legacy free
|
|
||||||
// application type
|
|
||||||
ResourceType type = ResourceType.createResourceType
|
|
||||||
("Portal", Portal.BASE_DATA_OBJECT_TYPE);
|
|
||||||
type.setDescription("A Portal!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reads supported mime types from a file and ???.
|
|
||||||
*
|
|
||||||
* Run once during initial load.
|
|
||||||
*/
|
|
||||||
private void loadMimeTypes() {
|
|
||||||
ClassLoader cload = Thread.currentThread().getContextClassLoader();
|
|
||||||
// get filename containing supported mime types as comma separated list
|
|
||||||
String resource = getResource();
|
|
||||||
InputStream is = cload.getResourceAsStream(resource);
|
|
||||||
if (is == null) {
|
|
||||||
throw new IllegalStateException("no such resource: " + resource);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
MimeTypeRow row = new MimeTypeRow();
|
|
||||||
CSVParameterReader loader = new CSVParameterReader
|
|
||||||
(new InputStreamReader(is), row.getParameters());
|
|
||||||
|
|
||||||
while (loader.next()) {
|
|
||||||
|
|
||||||
row.load(loader);
|
|
||||||
|
|
||||||
s_log.info("Adding mimetype: " + row.getType() + " (" +
|
|
||||||
row.getLabel() + ")");
|
|
||||||
MimeType mime = MimeType.createMimeType
|
|
||||||
(row.getType(), row.getJavaClass(), row.getObjectType());
|
|
||||||
mime.setLabel(row.getLabel());
|
|
||||||
mime.setFileExtension(row.getDefaultExtension());
|
|
||||||
|
|
||||||
if (mime instanceof TextMimeType) {
|
|
||||||
((TextMimeType) mime).setAllowINSOConvert
|
|
||||||
("1".equals(row.getSizerOrINSO()));
|
|
||||||
}
|
|
||||||
if (mime instanceof ImageMimeType) {
|
|
||||||
((ImageMimeType) mime).setImageSizer(row.getSizerOrINSO());
|
|
||||||
}
|
|
||||||
String[] extensions =
|
|
||||||
StringUtils.split(row.getExtensions(), ',');
|
|
||||||
for (int i = 0; i < extensions.length; i++) {
|
|
||||||
MimeTypeExtension ext =
|
|
||||||
MimeTypeExtension.create(extensions[i],
|
|
||||||
mime.getMimeType());
|
|
||||||
ext.save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
try { is.close(); }
|
|
||||||
catch (IOException e) { throw new UncheckedWrapperException(e); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadGlobalization() throws ConfigError {
|
|
||||||
List charsets = (List) getCharsets();
|
|
||||||
if ( charsets == null ) {
|
|
||||||
throw new ConfigError
|
|
||||||
("You must specify at least one charset in the m_charsets " +
|
|
||||||
"parameter of the core loader parameter section. " +
|
|
||||||
"UTF-8 would be a good first choice.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Map charsetMap = new HashMap();
|
|
||||||
|
|
||||||
for (Iterator i=charsets.iterator(); i.hasNext(); ) {
|
|
||||||
String charsetName = (String) i.next();
|
|
||||||
s_log.debug("Dealing with charset name: " + charsetName );
|
|
||||||
|
|
||||||
// Check if this is a valid charset. Is there a better way to do
|
|
||||||
// this? - vadimn@redhat.com, Mon 2002-07-29 14:47:41 -0400
|
|
||||||
try {
|
|
||||||
new OutputStreamWriter(new ByteArrayOutputStream(), charsetName);
|
|
||||||
} catch (UnsupportedEncodingException ex) {
|
|
||||||
throw new ConfigError
|
|
||||||
(charsetName + " is not a supported charset");
|
|
||||||
}
|
|
||||||
Charset charset = new Charset();
|
|
||||||
charset.setCharset(charsetName);
|
|
||||||
charset.save();
|
|
||||||
charsetMap.put(charsetName, charset);
|
|
||||||
}
|
|
||||||
|
|
||||||
List locales = (List) getLocales();
|
|
||||||
|
|
||||||
if ( locales == null ) {
|
|
||||||
throw new ConfigError
|
|
||||||
("You must specify at least one locale in the m_locales " +
|
|
||||||
"parameter of core loader parameter section. " +
|
|
||||||
"The \"en\" locale is probably required.");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Iterator i=locales.iterator(); i.hasNext(); ) {
|
|
||||||
List localeData = (List) i.next();
|
|
||||||
String language = (String) localeData.get(0);
|
|
||||||
String country = (String) localeData.get(1);
|
|
||||||
String variant = (String) localeData.get(2);
|
|
||||||
String charsetName = (String) localeData.get(3);
|
|
||||||
Locale locale = new Locale(language, country, variant);
|
|
||||||
|
|
||||||
Charset defaultCharset = (Charset) charsetMap.get(charsetName);
|
|
||||||
if ( defaultCharset == null ) {
|
|
||||||
throw new ConfigError
|
|
||||||
("You must list " + charsetName + " in the \"m_charsets\" " +
|
|
||||||
"parameter before using it in the \"m_locales\" " +
|
|
||||||
"\" parameter.");
|
|
||||||
}
|
|
||||||
locale.setDefaultCharset(defaultCharset);
|
|
||||||
locale.save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -40,6 +40,11 @@ import java.net.URL;
|
||||||
*/
|
*/
|
||||||
public class RegistryConfig extends AbstractConfig {
|
public class RegistryConfig extends AbstractConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to unmarshal parameter values.
|
||||||
|
* @param str A String of comma separated values
|
||||||
|
* @return StringArray of the values
|
||||||
|
*/
|
||||||
private static String[] array(String str) {
|
private static String[] array(String str) {
|
||||||
if (str == null) {
|
if (str == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -48,19 +53,38 @@ public class RegistryConfig extends AbstractConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of installed packages.
|
||||||
|
*
|
||||||
|
* Provided as a comma separated package-key list of installed packages.
|
||||||
|
* The parameter overwrites the default marshal and unmarshal methods to
|
||||||
|
* allow the String parameter to hold a list of values.
|
||||||
|
*
|
||||||
|
* TODO: Replace the type String parameter by StringArray parameter which
|
||||||
|
* provides exactly the required functionality (doesn't it?).
|
||||||
|
*/
|
||||||
private Parameter m_packages = new StringParameter
|
private Parameter m_packages = new StringParameter
|
||||||
("waf.config.packages", Parameter.OPTIONAL, new String[0]) {
|
("waf.config.packages", Parameter.OPTIONAL, new String[0]) {
|
||||||
|
@Override
|
||||||
protected Object unmarshal(String value, ErrorList errs) {
|
protected Object unmarshal(String value, ErrorList errs) {
|
||||||
return array(value);
|
return array(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected String marshal(Object obj) {
|
protected String marshal(Object obj) {
|
||||||
return StringUtils.join((String[]) obj, ',');
|
return StringUtils.join((String[]) obj, ',');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of parameter values, purpose currently unkown.
|
||||||
|
*
|
||||||
|
* The parameter overwrites the default marshal and unmarshal methods to
|
||||||
|
* allow the String parameter to hold a list of values.
|
||||||
|
*/
|
||||||
private Parameter m_parents = new StringParameter
|
private Parameter m_parents = new StringParameter
|
||||||
("waf.config.parents", Parameter.OPTIONAL, new URL[0]) {
|
("waf.config.parents", Parameter.OPTIONAL, new URL[0]) {
|
||||||
|
@Override
|
||||||
protected Object unmarshal(String value, ErrorList errs) {
|
protected Object unmarshal(String value, ErrorList errs) {
|
||||||
String[] strs = array(value);
|
String[] strs = array(value);
|
||||||
URL[] result = new URL[strs.length];
|
URL[] result = new URL[strs.length];
|
||||||
|
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2.1 of
|
|
||||||
* the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package com.arsdigita.web;
|
|
||||||
|
|
||||||
import com.arsdigita.domain.DomainCollection;
|
|
||||||
import com.arsdigita.domain.DomainObject;
|
|
||||||
import com.arsdigita.persistence.DataCollection;
|
|
||||||
import com.arsdigita.persistence.DataObject;
|
|
||||||
import com.arsdigita.persistence.OID;
|
|
||||||
import com.arsdigita.persistence.SessionManager;
|
|
||||||
import com.arsdigita.runtime.Startup;
|
|
||||||
import com.arsdigita.util.Assert;
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Subject to change.
|
|
||||||
*
|
|
||||||
* @author Justin Ross <jross@redhat.com>
|
|
||||||
* @version $Id: WebApp.java 738 2005-09-01 12:36:52Z sskracic $
|
|
||||||
*/
|
|
||||||
public final class WebApp extends DomainObject {
|
|
||||||
|
|
||||||
private static final Logger s_log = Logger.getLogger(WebApp.class);
|
|
||||||
|
|
||||||
public static final String BASE_DATA_OBJECT_TYPE =
|
|
||||||
"com.arsdigita.web.WebApp";
|
|
||||||
|
|
||||||
protected String getBaseDataObjectType() {
|
|
||||||
return BASE_DATA_OBJECT_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WebApp(final DataObject data) {
|
|
||||||
super(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getName() {
|
|
||||||
return (String) get("name");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static WebApp create(final String name) {
|
|
||||||
Assert.exists(name, String.class);
|
|
||||||
|
|
||||||
final DataObject data = SessionManager.getSession().create
|
|
||||||
(new OID(BASE_DATA_OBJECT_TYPE, name));
|
|
||||||
|
|
||||||
return new WebApp(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DomainCollection retrieveAll() {
|
|
||||||
final DataCollection all = SessionManager.getSession().retrieve
|
|
||||||
(BASE_DATA_OBJECT_TYPE);
|
|
||||||
|
|
||||||
return new DomainCollection(all);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Informal testing code
|
|
||||||
public static final void main(final String[] args) {
|
|
||||||
new Startup().run();
|
|
||||||
|
|
||||||
SessionManager.getSession().getTransactionContext().beginTxn();
|
|
||||||
|
|
||||||
if (args.length == 1) {
|
|
||||||
WebApp.create(args[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
final DomainCollection webapps = WebApp.retrieveAll();
|
|
||||||
|
|
||||||
while (webapps.next()) {
|
|
||||||
final WebApp webapp = (WebApp) webapps.getDomainObject();
|
|
||||||
|
|
||||||
System.out.println(webapp.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
SessionManager.getSession().getTransactionContext().commitTxn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue